package com.hexinfo.dmpro.common.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Zheng Jie
 * 翻译工具类
 */
@Slf4j
public class ConnExecuteUtil {

    //连接数据库
    public static Connection connDataBase(String driver,String url,String username,String password) {
        Connection con = null;
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(url, username, password);
            if (!con.isClosed()) {
                log.info("已成功连接数据库！");
            }
        }catch (Exception e){
            e.printStackTrace();
            log.error("连接数据库失败！！！！！！");
        }
        return con;
    }

    /**
     * 执行shell脚本，只返回执行结果
     * @param pathOrCommand 脚本路径或者命令
     * @return
     */
    public static int execShellCode(String pathOrCommand) {
        int exitValue = 0;
        try {
            // 执行脚本
            Process ps = Runtime.getRuntime().exec(pathOrCommand);
            exitValue = ps.waitFor();
//            if (0 != exitValue) {
//                log.error("执行shell脚本失败命令： " + pathOrCommand);
//            }
        } catch (Exception e) {
            log.error("执行shell脚本失败命令：{}，执行shell脚本失败报错：{}",pathOrCommand,e);
            return 999;
        }
        return exitValue;
    }

    /**
     * 执行shell脚本，返回shell脚本echo打印出的数据
     * @param pathOrCommand 脚本路径或者命令
     * @return
     */
    public static Map<String,Object> execShell(String pathOrCommand) {
        Map<String,Object> map = new HashMap<>();
        List<String> result = new ArrayList<>();
        try {
            // 执行脚本
            Process ps = Runtime.getRuntime().exec(pathOrCommand);
            int exitValue = ps.waitFor();
            if (0 != exitValue) {
                log.error("执行shell脚本失败命令： " + pathOrCommand);
            }
            // 只能接收脚本echo打印的数据，并且是echo打印的最后一次数据
            BufferedInputStream in = new BufferedInputStream(ps.getInputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = br.readLine()) != null) {
                result.add(line);
            }
            in.close();
            br.close();
            map.put("state",exitValue);
            map.put("message",result);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行shell脚本失败命令： " + pathOrCommand);
            log.error("执行shell脚本失败报错： " + e.getMessage());
            map.put("state",999);
        }
        log.info("脚本返回的数据如下： " + map.toString());
        return map;
    }
}
